<?php


namespace Tbf\Component\Http\ServeFile;

/**
 * 文件系统  url->文件map 对象
 * 1.各种前缀以目录分隔
 * 2.以addMap的顺序从前向后找匹配的url的前缀,如果匹配到,则返回.
 * 2.不要将同一个url映射多次...
 * 3.仅仅做映射,不检查文件是否存在...
 */
class FileSystemMap extends FileMap implements FileMapInterface{
    /** @var FileMapInterface[] */
    protected $map_list = array();
    protected $exclude_url_map = array();
    function addMap(FileMapInterface $map){
        $this->map_list[] = $map;
    }

    /**
     * 不处理某个url
     * @param $url
     */
    function addExcludeUrl($url){
        $this->exclude_url_map[$url] = true;
    }

    /**
     * 查找某个url,如果错误是'Not Handle' 表示这个类不做处理
     * func(url string)(path,err)
     * @param $prefix
     */
    function findFileByUrl($url)
    {
        list($url,$err) = $this->parseUrl($url);
        if ($err!==null){
            return array(null,$err);
        }
        if (!empty($this->exclude_url_map[$url])){
            return array(null,'Not Handle');
        }
        foreach($this->map_list as $map){
            list($path,$err) = $map->findFileByUrl($url);
            switch($err){
                case null: return array($this->prefix_file_path.$path,null);
                case 'Not Handle': continue 2;
                default: return array(null,$err);
            }
        }
        return array(null,'Not Handle');
    }
}